//
// Created by liaohailong on 2025/4/9.
//

#ifndef HELLOVIDEOCACHE_HELLOFILE_HPP
#define HELLOVIDEOCACHE_HELLOFILE_HPP

#include <string>
#include <iostream>
#include <filesystem>
#include <ostream>
#include <sstream>
#include <fstream>
#include <functional>
#include <vector>

#include "../log/Logger.hpp"

/**
 * create by liaohailong
 * 2025/4/9 22:11
 * desc: 
 */
class HelloFile
{
public:
    typedef std::function<bool(char *buffer, long size)> OnChunkRead;
public:
    /**
     * @param filepath 完整的全路径
     */
    explicit HelloFile(const std::string &filepath);

    /**
     * @param parent 父目录 完整的全路径
     * @param filename 文件名
     */
    HelloFile(const std::string &parent, const std::string &filename);

    ~HelloFile();

public:

    /**
     * @return true=文件存在
     */
    bool exist();

    /**
     * 判断 filepath 是否为目录（存在的）
     * @param filepath 全路径
     * @return true=是目录
     */
    bool isDir();

    /**
     * 判断 filepath 是否为文件（存在的）
     * @param filepath 全路径
     * @return true=是文件
     */
    bool isFile();

    /**
     * @return 返回当前目录下的子文件（非递归）
     */
    std::vector<std::shared_ptr<HelloFile>> listFile();

    /**
     * @return 创建一个普通文件，如果当前文件存在，则会失败
     */
    bool createNewFile();

    /**
     * @return 逐级创建目录，当前目录存在，则会失败
     */
    bool mkdirs();

    /**
     * @return 删除文件或者文件夹,返回true表示删除成功
     */
    bool deleteFile();

    /**
     * @return 返回上一级目录(全路径)，没有的话返回空字符串
     */
    std::string getParent();

    /**
     * @return 获取完全的全路径
     */
    std::string getAbsolutFilepath();

    /**
     * @return 获取文件名
     */
    std::string getFilename();

    /**
     * @return 获取文件大小（单位：字节），如果不是普通文件或获取失败，返回 -1
     */
    int64_t getLength();

    /**
    * 读取文本文件全部内容为 std::string
    * @param filepath 文件的完整路径
    * @return 文件内容字符串，读取失败返回空字符串
    */
    std::string readFileAsString();

    /**
     * 往文本中写入字符串
     * @param content 待写入的字符串
     * @param append true表示追加式写入
     * @return true表示写入成功
     */
    bool writeString2File(const std::string &content, bool append = false);

    /**
     * 以二进制流读取文件数据
     * @param offset 起始偏移
     * @param length 一共读多少字节量
     * @param read 分片读取回调
     * @return true表示全部成功读完，false表示没读全
     */
    bool readFileBinary(std::streamoff offset, std::streamsize length, const OnChunkRead &read);

    /**
     * 追加（拼接）文件
     * @param file 待追加（拼接）的文件
     * @param offset 从offset位置（包含）开始写入字节
     * @return true表示成功追加（拼接）
     */
    bool appendFile(const std::shared_ptr<HelloFile> &file, int64_t offset = -1);

private:
    Logger logger;

    std::string filepath;
    std::string filename;

};


#endif //HELLOVIDEOCACHE_HELLOFILE_HPP
